Issue observed:
Sporadicaly stopping arrays using "mdadm -Ss" command does not succeded.
Cause:
Writting "inactive" to the array state not succeded- array is busy
(accessed by udev, blkid etc.)
Resolution:
If writing 'inactive' fails, wait and retry again (because it is possibly
a transient failure)
Signed-off-by: Krzysztof Wojcik <krzysztof.wojcik [at] intel.com>
---
Manage.c | 23 ++++++++++++++++-------
1 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/Manage.c b/Manage.c
index ed3112e..a6531f3 100644
--- a/Manage.c
+++ b/Manage.c
[at] [at] -224,7 +224,9 [at] [at] int Manage_runstop(char *devname, int fd, int runstop, int quiet)
close(fd);
fprintf(stderr,
Name ": Cannot get exclusive access to %s:"
- " possibly it is still in use.\n",
+ "Perhaps a running "
+ "process, mounted filesystem "
+ "or active volume group?\n",
devname);
return 1;
}
[at] [at] -234,12 +236,18 [at] [at] int Manage_runstop(char *devname, int fd, int runstop, int quiet)
is_subarray(mdi->text_version)) {
/* This is mdmon managed. */
close(fd);
- if (sysfs_set_str(mdi, NULL,
- "array_state", "inactive") < 0) {
- if (quiet == 0)
- fprintf(stderr, Name
- ": failed to stop array %s: %s\n",
- devname, strerror(errno));
+
+ count = 25;
+ while (count && sysfs_set_str(mdi, NULL,
+ "array_state", "inactive") < 0
+ && errno == EBUSY) {
+ usleep(200000);
+ count--;
+ }
+ if (!count && !quiet) {
+ fprintf(stderr, Name
+ ": failed to stop array %s: %s\n",
+ devname, strerror(errno));
return 1;
}
[at] [at] -297,6 +305,7 [at] [at] int Manage_runstop(char *devname, int fd, int runstop, int quiet)
usleep(200000);
count --;
}
+
if (fd >= 0 && err) {
if (quiet == 0) {
fprintf(stderr, Name
--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo [at] vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
